package cn.zhouyafeng.itchat4j.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.zhouyafeng.itchat4j.Wechat;
import com.google.zxing.qrcode.encoder.QRCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.zhouyafeng.itchat4j.api.WechatTools;
import cn.zhouyafeng.itchat4j.core.Core;
import cn.zhouyafeng.itchat4j.service.ILoginService;
import cn.zhouyafeng.itchat4j.service.impl.LoginServiceImpl;
import cn.zhouyafeng.itchat4j.thread.CheckLoginStatusThread;
import cn.zhouyafeng.itchat4j.utils.SleepUtils;
import cn.zhouyafeng.itchat4j.utils.tools.CommonTools;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * 登陆控制器
 * @author https://github.com/yaphone
 * @version 1.0
 * @date 创建时间：2017年5月13日 下午12:56:07
 */
public class LoginController {
    private static Logger LOG = LoggerFactory.getLogger(LoginController.class);

    public static void login(Core core) {
        ILoginService loginService = new LoginServiceImpl(core);
        String qrPath = Wechat.getRootDir();
        if (core.isAlive()) { // 已登陆
            LOG.info("itchat4j已登陆");
            //return;
        } else {
            while (true) {
                for (int count = 0; count < 10; count++) {
                    LOG.info("获取UUID");
                    while (loginService.getUuid() == null) {
                        LOG.info("1. 获取微信UUID");
                        while (loginService.getUuid() == null) {
                            LOG.warn("1.1. 获取微信UUID失败，两秒后重新获取");
                            SleepUtils.sleep(2000);
                        }
                    }
                    LOG.info("2. 获取登陆二维码图片");
                    if (loginService.getQR(qrPath)) {
                        break;
                    } else if (count == 9) {
                        LOG.error("2.2. 获取登陆二维码图片失败，系统退出");
                        core.shutdown();
                    }
                }
                LOG.info("3. 请扫描二维码图片，并在手机上确认");
                File qrCodeFile = new File(qrPath + "QR.jpg");
                LOG.info("二维码内容:" + QrCodeUtil.decode(qrCodeFile));
                if (!core.isAlive()) {
                    loginService.login();
                    core.setAlive(true);
                    LOG.info(("登陆成功"));
                    qrCodeFile.delete();
                    if (core.isUseHotReload()) {
                        core.saveLoginState();
                    }
                    break;
                }
                LOG.info("4. 登陆超时，请重新扫描二维码图片");
            }
        }
        LOG.info("5. 登陆成功，微信初始化");
        if (!loginService.webWxInit()) {
            LOG.error("6. 微信初始化异常");
            Core.delhotReloadDir();
            core.shutdown();
        }
        LOG.info("6. 开启微信状态通知");
        loginService.wxStatusNotify();

        LOG.info("7. 清除。。。。");
        CommonTools.clearScreen();
        LOG.info(String.format("欢迎回来， %s", core.getNickName()));

        LOG.info("8. 开始接收消息");
        loginService.startReceiving();

        LOG.info("9. 获取联系人信息");
        loginService.webWxGetContact();

        LOG.info("10. 获取群好友及群好友列表");
        loginService.WebWxBatchGetContact();

        LOG.info("11. 缓存本次登陆好友相关消息");
        WechatTools.setUserInfo(core); // 登陆成功后缓存本次登陆好友相关消息（NickName, UserName）

        LOG.info("12.开启微信状态检测线程");
        core.getThreadPool().execute(new CheckLoginStatusThread(core));
    }
}